package com.yeban.javase.day18.test.test01;

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

/**
 * @Desc TODO
 * @Author yeban
 * @Date 2025/11/2
 *
 * 需求：
 * 线程1要执行打印：A和C，线程2要执行打印：B，
 * 但线程1在打印A后，要线程2打印B之后才能打印C，
 * 所以：线程1在打印A后，必须等待线程2打印完B之后才能继续执行。
 *
 * 多线程的情况下 C -> B -> A
 * CyclicBarrier类
 */
public class CyclicBarrier1CBA {

    public static void main(String[] args) {
        // 第一个参数：屏障数    第二个参数：达到屏障后可以执行的任务
        CyclicBarrier cB = new CyclicBarrier(2);
        /*CyclicBarrier cB = new CyclicBarrier(3,() -> {
            System.out.println("输出顺序为：C -> B -> A");
        });*/

        // 线程1：打印A和C
        new Thread(() -> {
            System.out.println("C");
            try {
                // 计数器+1 为2
                cB.await();
            } catch (InterruptedException | BrokenBarrierException e) {
                throw new RuntimeException(e);
            }
            System.out.println("A");
        }).start();

        // 线程2：打印B
        new Thread(() -> {
            System.out.println("B");
            try {
                // 计数器+1 为1
                cB.await();
            } catch (InterruptedException | BrokenBarrierException e) {
                throw new RuntimeException(e);
            }
        }).start();

        // 线程3：打印输出顺序
        new Thread(() -> {
            try {
                cB.await(); // 等到C和B都完成
                Thread.sleep(100); // 等A执行完
                System.out.println("输出顺序为：C -> B -> A");
            } catch (InterruptedException | BrokenBarrierException e) {
                throw new RuntimeException(e);
            }
        }).start();
    }
}
